;##################################
;命令：
;nasm -f elf64 day30_1trans_0vunpcklps_0vinsertps.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;Value in arr[0] is 5.555500.
;Value in arr[1] is 13.333300.
;Value in arr[2] is 0.000000.
;Value in arr[3] is 0.000000.
;##################################
extern printf

section .data
	msg: db `Value in arr[%d] is %f.\n`, 0
	arr: dd 0.0000, 1.1111, 2.2222, 3.3333, 4.4444, 5.5555, 6.6666, 7.7777, 8.8888, 9.9999, 10.0000, 11.1111, 12.2222, 13.3333, 14.4444, 15.5555

section .text
	global main

main:
	push rbp
	mov rbp, rsp

;####################################################################################
	;清空xmm0寄存器
	xorps xmm0, xmm0
	vmovss xmm0, [arr + 4 * 5]
	;它是vunpcklps指令的加强版
	;允许更多的位置填充
	;首先，xmm0寄存器第一个位置上的数可以通过vmovss完成
	;vinsertps主要完成后面三个位置的插入，分别对应10h,20h,30h
	;也可以看做xmm0被内存的一个数插入了一下，放到另外一个寄存器xmm1里
	;xmm0和xmm1同一的时候，可以看做xmm0被内存的一个数插入了一下
	;主要用来加强vmovsd指令，这个指令帮助不连续的内存进行拼凑
	vinsertps xmm1, xmm0, [arr + 4 * 13], 10h
	vmovups [arr], xmm1
;####################################################################################

	;打印
	mov ebx, 0
	jmp compare

execute:
	mov rdi, msg
	movsxd rsi, ebx
	cvtss2sd xmm0, dword [arr + 4 * ebx]
	movq rdx, xmm0
	call printf

	inc ebx

compare:
	cmp ebx, 4
	jl execute

	mov eax, 0
	leave
	ret
